#include <iostream>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <signal.h>

using namespace std;

void handler(int signo)
{
    cout << "get a signo : " << signo << endl;
}

int main()
{
    signal(SIGINT,handler);

    sigset_t bset, oset;
    sigemptyset(&bset);
    sigaddset(&bset, 2);
    sigprocmask(SIG_SETMASK, &bset, &oset);

    // 检验是否将2号信号进行了屏蔽
    // cout << "maskbit: ";
    // for(int i = 31; i >= 1; --i)
    // {
    //     if(sigismember(&bset,i)) cout << '1';
    //     else cout << '0';
    // }
    // cout << endl;

    sigset_t pending;
    sigemptyset(&pending);
    int cnt = 20;
    while (cnt--)
    {
        int n = sigpending(&pending);
        cout << "id:" << getpid() << " pending set:";
        for (int i = 31; i >= 1; --i)
        {
            if (sigismember(&pending, i))
                cout << '1';
            else
                cout << '0';
        }
        cout << endl;
        sleep(1);
        if(cnt == 5)
        {
            cout << "unblock 2 signo" << endl;
            sigprocmask(SIG_SETMASK, &oset, nullptr);
        }
    }

    // pid_t pid = fork();
    // if(pid == 0)
    // {
    //     // child
    //     int cnt = 100;
    //     while(cnt--)
    //     {
    //         cout << "I am child , pid : " << getpid() << endl;
    //         sleep(1);
    //     }
    // }

    // // parent
    // int status = 0;
    // pid_t ret = waitpid(pid,&status,0);
    // cout << "wait success! exit code: " << ((status>>8)&0xFF) <<
    // " exit signal: " << (status & 0x7F) <<
    // " core dump code: " << ((status>>7)&1) << endl;
    // sleep(5);

    return 0;
}